package com.xinqi.modules.sys.menu.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.modules.sys.menu.dto.req.AddRoleMenuDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuAllQueryDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuCreateDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuDeleteDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuQueryDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuTreeDTO;
import com.xinqi.modules.sys.menu.dto.req.MenuUpdateDTO;
import com.xinqi.modules.sys.menu.dto.rsp.MenuResultDTO;
import org.springframework.transaction.annotation.Transactional;

import javax.validation.Valid;
import java.util.List;

/**
 * 系统菜单服务层
 *
 * @author: linkai
 * @date: 2023/04/01
 */
public interface MenuService {
    /**
     * 分页查询 系统菜单数据
     */
    PageInfo<MenuResultDTO> page(Param pageable, MenuQueryDTO query);

    /**
     * 查询 系统菜单数据
     */
    List<MenuResultDTO> find(MenuQueryDTO query);

    /**
     * 根据id查询 系统菜单数据
     */
    MenuResultDTO findById(Long id);

    /**
     * 新增 系统菜单数据
     */
    Long insert(@Valid MenuCreateDTO dto);

    /**
     * 根据id修改 系统菜单数据
     */
    Boolean updateById(@Valid MenuUpdateDTO dto);

    /**
     * 根据id删除 系统菜单数据
     */
    Boolean deleteById(Long id);

    /**
     * 根据id删除 系统菜单数据
     */
    Boolean deleteById(MenuDeleteDTO dto);

    List<MenuResultDTO> findTree(@Valid MenuTreeDTO form);

    List<MenuResultDTO> findAll(@Valid MenuAllQueryDTO dto);

    List<MenuResultDTO> findChildByParentId(Long parentId);

    List<Long> findAllIds(@Valid MenuAllQueryDTO dto);

    List<MenuResultDTO> findUserMenu(Long userId);

    @Transactional(rollbackFor = Exception.class)
    boolean addRoleMenu(AddRoleMenuDTO dto);

    List<MenuResultDTO> getRoleMenu(Long roleId);

    List<MenuResultDTO> findCurrentUserMenu();
}
